home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 26
/
AMIGAplus Sonderheft 26 (2000)(Falke)(DE)(Track 1 of 2)[!].iso
/
Tools
/
GFX-Viewer
/
Animviewer
/
mpegvideo_datatype
/
ham
/
HAMView.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-29
|
29KB
|
1,125 lines
/*
** PhotoworX - Ein Softwarepaket zur Bearbeitung
** von Kodak Photo-CDs
**
** Copyright © 1993-1995 by Corporate Media GmbH
** Geschrieben von Olaf Barthel
*/
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <exec/execbase.h>
#include <exec/memory.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <clib/exec_protos.h>
#include <clib/macros.h>
#include <pragmas/intuition_pragmas.h>
#include <pragmas/graphics_pragmas.h>
#include <pragmas/utility_pragmas.h>
#include <pragmas/exec_sysbase_pragmas.h>
#define USE_BUILTIN_MATH
#include <string.h>
#define LIB_CODE
#include "viewer.h"
#undef LIB_CODE
enum { MODE_HAM6,MODE_HAM8,MODE_MAX };
#define SPREAD(v) ((ULONG)(v) << 24 | (ULONG)(v) << 16 | (ULONG)(v) << 8 | (v))
#define PORTMASK(p) (1L << ((struct MsgPort *)p) -> mp_SigBit)
struct ExecBase *SysBase;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct Library *UtilityBase;
struct SignalSemaphore Semaphore;
LONG ShadeTable[] =
{
16 * 16 * 16,
64 * 64 * 64,
0
};
struct VL_ModeTable ModeTable =
{
"Hold-and-modify Display",
ShadeTable
};
VOID (* __asm WriteLine)(register __a0 struct RastPort *RPort,register __d0 LONG Column,register __d1 LONG Line,register __d2 LONG Width,register __a2 APTR Array,register __a1 struct RastPort *Temp);
extern WORD __asm Luminance(register __d0 WORD Red,register __d1 WORD Green,register __d2 WORD Blue);
extern VOID __asm CreateHAM6Line(register __a0 UBYTE *R,register __a1 UBYTE *G,register __a2 UBYTE *B,register __a3 UBYTE *Line,register __d3 LONG PixelPlus,register __d4 WORD Width);
extern VOID __asm CreateHAM8Line(register __a0 UBYTE *R,register __a1 UBYTE *G,register __a2 UBYTE *B,register __a3 UBYTE *Line,register __d3 LONG PixelPlus,register __d4 WORD Width);
LONG __saveds __asm __UserLibInit(register __a6 struct Library *LibBase);
VOID __saveds __asm __UserLibCleanup(register __a6 struct Library *LibBase);
struct VL_ModeTable * __saveds __asm VL_GetModeTable(VOID);
LONG __saveds __asm VL_OpenView(register __a0 struct VL_ViewHandle *Handle);
VOID __saveds __asm VL_CloseView(register __a0 struct VL_ViewHandle *Handle);
LONG __saveds __asm VL_MoveView(register __a0 struct VL_ViewHandle *Handle,register __d0 LONG X,register __d1 LONG Y);
ULONG __saveds __asm VL_TranslateIDCMP(register __a0 struct VL_ViewHandle *Handle,register __d0 ULONG IDCMP);
STATIC VOID __asm
PositionLine8(register __a0 struct RastPort *RPort,register __d0 LONG Column,register __d1 LONG Line,register __d2 LONG Width,register __a2 APTR Array,register __a1 struct RastPort *Temp)
{
#pragma libcall GfxBase WritePixelLine8 306 9A210806
WritePixelLine8(RPort,Column,Line,Width,Array,Temp);
}
STATIC VOID __asm
PositionChunkyPixels(register __a0 struct RastPort *RPort,register __d0 LONG Column,register __d1 LONG Line,register __d2 LONG Width,register __a2 APTR Array,register __a1 struct RastPort *Temp)
{
#pragma libcall GfxBase WriteChunkyPixels 420 4a3210807
WriteChunkyPixels(RPort,Column,Line,Column + Width - 1,Line,Array,(Width + 15) & ~15);
}
STATIC VOID
DeleteBitMap(struct BitMap *BitMap)
{
if(GfxBase -> LibNode . lib_Version >= 39)
FreeBitMap(BitMap);
else
{
LONG i;
for(i = 0 ; i < BitMap -> Depth ; i++)
{
if(BitMap -> Planes[i])
FreeVec(BitMap -> Planes[i]);
}
FreeVec(BitMap);
}
}
STATIC struct BitMap *
CreateBitMap(LONG Width,LONG Height,LONG Depth,ULONG Flags,struct BitMap *Friend)
{
if(GfxBase -> LibNode . lib_Version >= 39)
return(AllocBitMap(Width,Height,Depth,Flags,Friend));
else
{
struct BitMap *BitMap;
if(BitMap = (struct BitMap *)AllocVec(sizeof(struct BitMap),MEMF_ANY | MEMF_CLEAR))
{
LONG i,PageSize;
InitBitMap(BitMap,Depth,Width,Height);
PageSize = BitMap -> BytesPerRow * BitMap -> Rows;
for(i = 0 ; i < BitMap -> Depth ; i++)
{
if(!(BitMap -> Planes[i] = (PLANEPTR)AllocVec(PageSize,MEMF_CHIP)))
{
LONG j;
for(j = 0 ; j < i ; j++)
FreeVec(BitMap -> Planes[j]);
FreeVec(BitMap);
return(NULL);
}
}
}
return(BitMap);
}
}
STATIC VOID
DeleteTempLine(UBYTE *Line)
{
FreeVec(Line);
}
STATIC UBYTE *
CreateTempLine(LONG Width,LONG Height)
{
return((UBYTE *)AllocVec(((Width + 15) & ~15) * Height,MEMF_ANY));
}
STATIC VOID
DeleteTempRPort(struct RastPort *Temp)
{
DeleteBitMap(Temp -> BitMap);
FreeVec(Temp);
}
STATIC struct RastPort *
CreateTempRPort(struct RastPort *Source)
{
struct RastPort *Temp;
if(Temp = (struct RastPort *)AllocVec(sizeof(struct RastPort),MEMF_ANY))
{
LONG Width,Depth;
CopyMem(Source,Temp,sizeof(struct RastPort));
Temp -> Layer = NULL;
if(GfxBase -> LibNode . lib_Version >= 39)
{
Width = GetBitMapAttr(Source -> BitMap,BMA_WIDTH);
Depth = GetBitMapAttr(Source -> BitMap,BMA_DEPTH);
}
else
{
Width = Source -> BitMap -> BytesPerRow * 8;
Depth = Source -> BitMap -> Depth;
}
if(Temp -> BitMap = CreateBitMap(Width,1,Depth,NULL,Source -> BitMap))
return(Temp);
else
FreeVec(Temp);
}
return(NULL);
}
STATIC VOID
CloseWindowSafely(struct Window *Window)
{
Forbid();
if(Window -> UserPort)
{
struct IntuiMessage *IntuiMessage;
struct Node *Successor;
SetSignal(0,1L << Window -> UserPort -> mp_SigBit);
IntuiMessage = (struct IntuiMessage *)Window -> UserPort -> mp_MsgList . lh_Head;
while(Successor = IntuiMessage -> ExecMessage . mn_Node . ln_Succ)
{
if(IntuiMessage -> IDCMPWindow == Window)
{
Remove(IntuiMessage);
ReplyMsg((struct Message *)IntuiMessage);
}
IntuiMessage = (struct IntuiMessage *)Successor;
}
Window -> UserPort = NULL;
}
ModifyIDCMP(Window,NULL);
Permit();
CloseWindow(Window);
}
LONG __saveds __asm __UserLibInit(register __a6 struct Library *LibBase)
{
SysBase = *(struct ExecBase **)4;
if(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",37))
{
if(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",37))
{
if(UtilityBase = OpenLibrary("utility.library",37))
{
if(ModeNotAvailable(DEFAULT_MONITOR_ID | HIRESHAMLACE_KEY))
ShadeTable[1] = 0;
if(GfxBase -> LibNode . lib_Version >= 40 && GfxBase -> ChunkyToPlanarPtr)
WriteLine = PositionChunkyPixels;
else
WriteLine = PositionLine8;
InitSemaphore(&Semaphore);
return(NULL);
}
CloseLibrary(GfxBase);
GfxBase = NULL;
}
CloseLibrary(IntuitionBase);
IntuitionBase = NULL;
}
return(1);
}
VOID __saveds __asm __UserLibCleanup(register __a6 struct Library *LibBase)
{
if(IntuitionBase)
{
CloseLibrary(IntuitionBase);
IntuitionBase = NULL;
}
if(GfxBase)
{
CloseLibrary(GfxBase);
GfxBase = NULL;
}
if(UtilityBase)
{
CloseLibrary(UtilityBase);
UtilityBase = NULL;
}
}
struct VL_ModeTable * __saveds __asm
VL_GetModeTable()
{
return(&ModeTable);
}
LONG __saveds __asm
VL_OpenView(register __a0 struct VL_ViewHandle *Handle)
{
LONG Error = 0;
if(Handle)
{
if(Handle -> vl_Mode < 0 || Handle -> vl_Mode >= MODE_MAX)
Error = VL_ERROR_INVALID_MODE;
else
{
if(Handle -> vl_Screen = OpenScreenTags(NULL,
SA_Overscan, OSCAN_STANDARD,
SA_Depth, Handle -> vl_Mode == MODE_HAM6 ? 6 : 8,
SA_DisplayID, Handle -> vl_Mode == MODE_HAM6 ? DEFAULT_MONITOR_ID | HAM_KEY : DEFAULT_MONITOR_ID | HIRESHAMLACE_KEY,
SA_Quiet, TRUE,
SA_ShowTitle, FALSE,
SA_Behind, TRUE,
SA_Interleaved, TRUE,
SA_BackFill, LAYERS_NOBACKFILL,
TAG_DONE))
{
if(Handle -> vl_Window = OpenWindowTags(NULL,
WA_Left, 0,
WA_Top, 0,
WA_Width, Handle -> vl_Screen -> Width,
WA_Height, Handle -> vl_Screen -> Height,
WA_Borderless, TRUE,
WA_Backdrop, TRUE,
WA_RMBTrap, TRUE,
WA_Activate, TRUE,
WA_SimpleRefresh, TRUE,
WA_NoCareRefresh, TRUE,
WA_CustomScreen, Handle -> vl_Screen,
WA_IDCMP, Handle -> vl_MsgPort ? NULL : Handle -> vl_IDCMP,
IntuitionBase->LibNode.lib_Version >= 39 ? WA_BackFill : TAG_IGNORE, LAYERS_NOBACKFILL,
TAG_DONE))
{
struct RastPort *TempRPort,*RPort = &Handle -> vl_Screen -> RastPort;
SetRast(RPort,0);
if(TempRPort = CreateTempRPort(RPort))
{
UBYTE *TempLine;
if(TempLine = CreateTempLine(Handle -> vl_Screen -> Width,1))
{
STATIC UWORD __chip BlankPointer[6];
SetPointer(Handle -> vl_Window,BlankPointer,1,16,0,0);
if(Handle -> vl_MsgPort)
{
Forbid();
Handle -> vl_Window -> UserPort = Handle -> vl_MsgPort;
if(!ModifyIDCMP(Handle -> vl_Window,Handle -> vl_IDCMP))
{
Permit();
CloseWindowSafely(Handle -> vl_Window);
Handle -> vl_Window = NULL;
}
else
Permit();
}
if(Handle -> vl_Window)
{
LONG i;
ObtainSemaphore(&Semaphore);
Handle -> vl_X = 0;
Handle -> vl_Y = 0;
Handle -> vl_VisibleX = min(Handle -> vl_Width,Handle -> vl_Screen -> Width);
Handle -> vl_VisibleY = min(Handle -> vl_Height,Handle -> vl_Screen -> Height);
Handle -> vl_MaxX = (Handle -> vl_Width <= Handle -> vl_VisibleX) ? 0 : Handle -> vl_Width - Handle -> vl_VisibleX;
Handle -> vl_MaxY = (Handle -> vl_Height <= Handle -> vl_VisibleY) ? 0 : Handle -> vl_Height - Handle -> vl_VisibleY;
if(Handle -> vl_Mode == MODE_HAM6)
{
for(i = 0 ; i < 16 ; i++)
SetRGB4(&Handle -> vl_Screen -> ViewPort,i,i,i,i);
}
else
{
ULONG Value;
for(i = 0 ; i < 64 ; i++)
{
Value = (255 * i) / 63;
SetRGB32(&Handle -> vl_Screen -> ViewPort,i,SPREAD(Value),SPREAD(Value),SPREAD(Value));
}
}
Handle -> vl_UserPort = Handle -> vl_Window -> UserPort;
ActivateWindow(Handle -> vl_Window);
ScreenToFront(Handle -> vl_Screen);
Handle -> vl_ClientData[0] = TempRPort;
Handle -> vl_ClientData[1] = TempLine;
if(Handle -> vl_Mode == MODE_HAM6)
{
LONG Width = Handle -> vl_Width,
Height = Handle -> vl_Height,
j;
UBYTE *RData = Handle -> vl_RData,
*GData = Handle -> vl_GData,
*BData = Handle -> vl_BData;
if(Width > Handle -> vl_Screen -> Width)
Width = Handle -> vl_Screen -> Width;
if(Height > Handle -> vl_Screen -> Height)
Height = Handle -> vl_Screen -> Height;
if(Handle -> vl_Colour)
{
for(i = 0 ; i < Height ; i++)
{
CreateHAM6Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Width);
(*WriteLine)(RPort,0,i,Width,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
for(i = 0 ; i < Height ; i++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(j = 0 ; j < Width ; j++)
{
TempLine[j] = Luminance(*R,*G,*B) >> 4;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,i,Width,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
else
{
LONG Width = Handle -> vl_Width,
Height = Handle -> vl_Height,
j;
UBYTE *RData = Handle -> vl_RData,
*GData = Handle -> vl_GData,
*BData = Handle -> vl_BData;
if(Width > Handle -> vl_Screen -> Width)
Width = Handle -> vl_Screen -> Width;
if(Height > Handle -> vl_Screen -> Height)
Height = Handle -> vl_Screen -> Height;
if(Handle -> vl_Colour)
{
for(i = 0 ; i < Height ; i++)
{
CreateHAM8Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Width);
(*WriteLine)(RPort,0,i,Width,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
for(i = 0 ; i < Height ; i++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(j = 0 ; j < Width ; j++)
{
TempLine[j] = Luminance(*R,*G,*B) >> 2;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,i,Width,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
ReleaseSemaphore(&Semaphore);
}
else
Error = VL_ERROR_NO_WINDOW;
}
else
Error = VL_ERROR_NO_MEMORY;
}
else
Error = VL_ERROR_NO_MEMORY;
}
else
Error = VL_ERROR_NO_WINDOW;
}
else
Error = VL_ERROR_NO_SCREEN;
}
}
else
Error = VL_ERROR_INVALID_PARAMETERS;
return(Error);
}
VOID __saveds __asm
VL_CloseView(register __a0 struct VL_ViewHandle *Handle)
{
if(Handle -> vl_ClientData[0])
{
DeleteTempRPort(Handle -> vl_ClientData[0]);
Handle -> vl_ClientData[0] = NULL;
}
if(Handle -> vl_ClientData[1])
{
DeleteTempLine(Handle -> vl_ClientData[1]);
Handle -> vl_ClientData[1] = NULL;
}
if(Handle -> vl_Window)
{
ScreenToBack(Handle -> vl_Window -> WScreen);
if(Handle -> vl_MsgPort)
CloseWindowSafely(Handle -> vl_Window);
else
CloseWindow(Handle -> vl_Window);
Handle -> vl_Window = NULL;
}
if(Handle -> vl_Screen)
{
CloseScreen(Handle -> vl_Screen);
Handle -> vl_Screen = NULL;
}
}
LONG __saveds __asm
VL_MoveView(register __a0 struct VL_ViewHandle *Handle,register __d0 LONG X,register __d1 LONG Y)
{
if(X > Handle -> vl_MaxX)
X = Handle -> vl_MaxX;
else
{
if(X < 0)
X = 0;
}
if(Y > Handle -> vl_MaxY)
Y = Handle -> vl_MaxY;
else
{
if(Y < 0)
Y = 0;
}
if(X != Handle -> vl_X || Y != Handle -> vl_Y)
{
struct RastPort *RPort = &Handle -> vl_Screen -> RastPort,*TempRPort = Handle -> vl_ClientData[0];
UBYTE *TempLine = Handle -> vl_ClientData[1];
ObtainSemaphore(&Semaphore);
if(Handle -> vl_X != X || Handle -> vl_Y != Y)
{
LONG From,Size,Src,Dst;
if(X != Handle -> vl_X)
{
if(X < Handle -> vl_X)
{
Size = Handle -> vl_X - X;
From = 0;
Src = 0;
Dst = Size;
}
else
{
Size = X - Handle -> vl_X;
From = Handle -> vl_VisibleX - Size;
Src = Size;
Dst = 0;
}
if(Size > Handle -> vl_VisibleX)
{
Size = Handle -> vl_VisibleX;
From = 0;
}
if(Size < Handle -> vl_VisibleX)
{
LONG OldPri = SetTaskPri(SysBase -> ThisTask,127);
Forbid();
WaitTOF();
ClipBlit(RPort,Src,0,RPort,Dst,0,Handle -> vl_VisibleX - Size,Handle -> vl_Screen -> Height,0xC0);
Permit();
SetTaskPri(SysBase -> ThisTask,OldPri);
}
if(!From && Size + 8 <= Handle -> vl_VisibleX)
Size += 8;
if(Handle -> vl_Mode == MODE_HAM6)
{
LONG x,y;
UBYTE *RData,*GData,*BData;
if(Handle -> vl_Colour)
{
if(From)
{
register LONG Size = 8;
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM6Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size);
(*WriteLine)(RPort,0,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
if(From && Size + 16 <= Handle -> vl_VisibleX)
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
RData -= 16 * Handle -> vl_PixelPlus;
GData -= 16 * Handle -> vl_PixelPlus;
BData -= 16 * Handle -> vl_PixelPlus;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM6Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size + 16);
(*WriteLine)(RPort,From,y,Size,TempLine + 16,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM6Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size);
(*WriteLine)(RPort,From,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
else
{
if(From)
{
register LONG Size = 8;
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 4;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
if(From && Size + 16 <= Handle -> vl_VisibleX)
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
RData -= 16 * Handle -> vl_PixelPlus;
GData -= 16 * Handle -> vl_PixelPlus;
BData -= 16 * Handle -> vl_PixelPlus;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size + 16 ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 4;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,From,y,Size,TempLine + 16,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 4;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,From,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
}
else
{
LONG x,y;
UBYTE *RData,*GData,*BData;
if(Handle -> vl_Colour)
{
if(From)
{
register LONG Size = 8;
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM8Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size);
(*WriteLine)(RPort,0,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
if(From && Size + 16 <= Handle -> vl_VisibleX)
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
RData -= 16 * Handle -> vl_PixelPlus;
GData -= 16 * Handle -> vl_PixelPlus;
BData -= 16 * Handle -> vl_PixelPlus;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM8Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size + 16);
(*WriteLine)(RPort,From,y,Size,TempLine + 16,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
CreateHAM8Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Size);
(*WriteLine)(RPort,From,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
else
{
if(From)
{
register LONG Size = 8;
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * X;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 2;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
if(From && Size + 16 <= Handle -> vl_VisibleX)
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
RData -= 16 * Handle -> vl_PixelPlus;
GData -= 16 * Handle -> vl_PixelPlus;
BData -= 16 * Handle -> vl_PixelPlus;
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size + 16 ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 2;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,From,y,Size,TempLine + 16,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
RData = Handle -> vl_RData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
GData = Handle -> vl_GData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
BData = Handle -> vl_BData + Handle -> vl_LinePlus * Y + Handle -> vl_PixelPlus * (X + From);
for(y = 0 ; y < Handle -> vl_VisibleY ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Size ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 2;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,From,y,Size,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
}
}
if(Y != Handle -> vl_Y)
{
if(Y < Handle -> vl_Y)
{
Size = Handle -> vl_Y - Y;
From = 0;
Src = 0;
Dst = Size;
}
else
{
Size = Y - Handle -> vl_Y;
From = Handle -> vl_VisibleY - Size;
Src = Size;
Dst = 0;
}
if(Size > Handle -> vl_VisibleY)
{
Size = Handle -> vl_VisibleY;
From = 0;
}
if(Size < Handle -> vl_VisibleY)
{
LONG OldPri = SetTaskPri(SysBase -> ThisTask,127);
Forbid();
WaitTOF();
ClipBlit(RPort,0,Src,RPort,0,Dst,Handle -> vl_Screen -> Width,Handle -> vl_VisibleY - Size,0xC0);
Permit();
SetTaskPri(SysBase -> ThisTask,OldPri);
}
if(Handle -> vl_Mode == MODE_HAM6)
{
LONG x,y;
UBYTE *RData = Handle -> vl_RData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X,
*GData = Handle -> vl_GData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X,
*BData = Handle -> vl_BData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X;
if(Handle -> vl_Colour)
{
for(y = 0 ; y < Size ; y++)
{
CreateHAM6Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Handle -> vl_VisibleX);
(*WriteLine)(RPort,0,From + y,Handle -> vl_VisibleX,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
for(y = 0 ; y < Size ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Handle -> vl_VisibleX ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 4;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,From + y,Handle -> vl_VisibleX,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
else
{
LONG x,y;
UBYTE *RData = Handle -> vl_RData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X,
*GData = Handle -> vl_GData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X,
*BData = Handle -> vl_BData + Handle -> vl_LinePlus * (From + Y) + Handle -> vl_PixelPlus * X;
if(Handle -> vl_Colour)
{
for(y = 0 ; y < Size ; y++)
{
CreateHAM8Line(RData,GData,BData,TempLine,Handle -> vl_PixelPlus,Handle -> vl_VisibleX);
(*WriteLine)(RPort,0,From + y,Handle -> vl_VisibleX,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
else
{
for(y = 0 ; y < Size ; y++)
{
register UBYTE *R = RData,
*G = GData,
*B = BData;
for(x = 0 ; x < Handle -> vl_VisibleX ; x++)
{
TempLine[x] = Luminance(*R,*G,*B) >> 2;
R += Handle -> vl_PixelPlus;
G += Handle -> vl_PixelPlus;
B += Handle -> vl_PixelPlus;
}
(*WriteLine)(RPort,0,From + y,Handle -> vl_VisibleX,TempLine,TempRPort);
RData += Handle -> vl_LinePlus;
GData += Handle -> vl_LinePlus;
BData += Handle -> vl_LinePlus;
}
}
}
}
}
ReleaseSemaphore(&Semaphore);
Handle -> vl_X = X;
Handle -> vl_Y = Y;
return(TRUE);
}
else
return(FALSE);
}
ULONG __saveds __asm
VL_TranslateIDCMP(register __a0 struct VL_ViewHandle *Handle,register __d0 ULONG IDCMP)
{
return(IDCMP);
}